home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / bbs / mfm_111b.zip / MFM.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-07  |  12KB  |  377 lines

  1. Program Maximus_File_Manager;
  2.  
  3. Uses
  4.   Crt, Dos, MaxAreas, Memory, MfmCopy, Screen, Strings;
  5.  
  6. Const
  7.   Pgmid = 'MFM 1.11b 07jan92 MWBJR Enterprise 1:273/701.0 (215)641-0270';
  8.   Base153A = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@!#$%&''()-^_`{}~';
  9.   Base153B = 'ÇÜÄÅÉÆÖ¢£¥₧ƒÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩';
  10.   Base153C = '╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■';
  11.   MaxSkip = 20;
  12.  
  13. Type
  14.   TypeOfRecordType = (Comment,FileRecord,Orphan,Offline);
  15.   ListPtr = ^ListRecord;
  16.   ListRecord = Record
  17.     NextEntry, PrevEntry : ListPtr;
  18.     TypeOfRecord : TypeOfRecordType;
  19.     FileName : String[12];
  20.     FileSize, FileDate : LongInt;
  21.     Description : String[144];
  22.     Tagged : Boolean;
  23.   End;
  24.   AreaPtr = ^AreaRecord;
  25.   AreaRecord = Record
  26.     NextEntry, PrevEntry : AreaPtr;
  27.     AreaPath, Name : String[40];
  28.     Changed : Boolean;
  29.   End;
  30.   S8 = String[8];
  31.  
  32. Var
  33.   Gcx : Char;
  34.   Gbx : Byte;
  35.   Counter, Row, AreaCounter, OffSet, Columns, ColumnPos : Byte;
  36.   Result : Word;
  37.   FileList, NewFileList : Text;
  38.   DirInfo : SearchRec;
  39.   Date : DateTime;
  40.   Month, Day : String[2];
  41.   Year : String[4];
  42.   AreaMask : String[20];
  43.   FileAreaPath : String[80];
  44.   WorkString : String;
  45.   NumberOfEntries, NumberOfAreaEntries, NumberOfFiles : Word;
  46.   D : DirStr;
  47.   N : NameStr;
  48.   E : ExtStr;
  49.   Altered, FilesBbs : Boolean;
  50.   FirstEntry, LastEntry, NewEntry, OldEntry, TopEntry, NextPrintEntry,
  51.   CurrentEntry, StackEntry, KillEntry, BeginSort, EndSort : ListPtr;
  52.   FirstAreaEntry, LastAreaEntry, NewAreaEntry,
  53.   OldAreaEntry, CurrentAreaEntry, ChooseAreaEntry : AreaPtr;
  54.   StringToFind : String[12];
  55.   FreeSpace, SizeOfFiles : LongInt;
  56.   FreeSpaceString : String[6];
  57.   OkToAddToList, Changed, MfmRunFb, AreaChanged : Boolean;
  58.   Base153 : String[153];
  59.   SkipList : Array[1..MaxSkip] Of String[12];
  60. {========================================================================}
  61.  
  62. {$I DISPLAY.PAS}
  63. {$I SETUP.PAS}
  64. {$I HELP.PAS}
  65. {$I EDIT.PAS}
  66. {$I ADOPTINS.PAS}
  67. {$I PUSHPOP.PAS}
  68. {$I SAVEKILL.PAS}
  69. {$I QUIT.PAS}
  70. {$I AREA.PAS}
  71. {$I COPYMOVE.PAS}
  72. {$I SORT.PAS}
  73. {$I RENFIND.PAS}
  74. {$I VIEWFILE.PAS}
  75.  
  76. {========================================================================}
  77. Procedure ParseCommandLine;
  78.   Var
  79.     x : Byte;
  80.     FileAreaPathOk, AreaPathOk, OutputSelected : Boolean;
  81.   Begin
  82.     ReDirectTo := StandardIO; FileAreaPath := ''; Columns := 5; ColumnPos := 16;
  83.     FileAreaPathOk := False; AreaPathOk := False; OutputSelected := False;
  84.     MfmRunFb := False; AreaChanged := False;
  85.     Assign(Input,''); Reset(Input);
  86.     Assign(Output,''); Rewrite(Output);
  87.     WriteLn(Pgmid); WriteLn;
  88.     If ParamCount = 0 Then
  89.     Begin
  90.       ReDirectTo := Console;
  91.       OutputSelected := True;
  92.       AssignCrt(Input); Reset(Input);
  93.       AssignCrt(Output); Rewrite(Output);
  94.       Fsplit(Fexpand(ParamStr(0)),D,N,E);
  95.       AreaPath := D+'AREA.DAT';
  96.       GetAreaTable;
  97.       If NumberOfAreaEntries < Columns Then Columns := NumberOfAreaEntries;
  98.       SetupScreen;
  99.       FileAreaPath := ChooseArea;
  100.       If (FileAreaPath = 'QUIT') Or (FileAreaPath = 'QUITQUICK') Then
  101.       Begin
  102.         Halt(250);
  103.       End;
  104.     End
  105.     Else
  106.     Begin
  107.       For x := 1 To ParamCount Do
  108.       Begin
  109.         If Copy(UpperString(ParamStr(x)),1,2) = '-A' Then
  110.         Begin
  111.           AreaPathOk := True;
  112.           AreaPath := Copy(UpperString(ParamStr(x)),3,Length(ParamStr(x))-2);
  113.           If Length(AreaPath) > 0 Then
  114.           Begin
  115.             FindFirst(AreaPath,Archive,DirInfo);
  116.             If DosError <> 0 Then
  117.             Begin
  118.               If Copy(AreaPath,Length(AreaPath),1) <> '\' Then AreaPath := AreaPath + '\';
  119.               FindFirst(AreaPath+'AREA.DAT',Archive,DirInfo);
  120.               If DosError <> 0 Then
  121.               Begin
  122.                 WriteLn('AREA.DAT not found in '+AreaPath+' !');
  123.                 Halt(1);
  124.               End
  125.               Else
  126.               Begin
  127.                 AreaPath := AreaPath + 'AREA.DAT';
  128.               End;
  129.             End;
  130.           End;
  131.         End;
  132.         If Copy(UpperString(ParamStr(x)),1,2) = '-C' Then
  133.         Begin
  134.           OutputSelected := True;
  135.           If Copy(ParamStr(x),3,1) = '0' Then
  136.           Begin
  137.             ReDirectTo := Console;
  138.             AssignCrt(Input); Reset(Input);
  139.             AssignCrt(Output); Rewrite(Output);
  140.           End;
  141.           If Copy(ParamStr(x),3,1) = '1' Then
  142.           Begin
  143.             ReDirectTo := ComPort1;
  144.             Assign(Input,'Com1'); Reset(Input);
  145.             Assign(Output,'Com1'); Rewrite(Output);
  146.           End;
  147.           If Copy(ParamStr(x),3,1) = '2' Then
  148.           Begin
  149.             ReDirectTo := ComPort2;
  150.             Assign(Input,'Com2'); Reset(Input);
  151.             Assign(Output,'Com2'); Rewrite(Output);
  152.           End;
  153.           If Copy(ParamStr(x),3,1) = '9' Then
  154.           Begin
  155.             ReDirectTo := StandardIO;
  156.             Assign(Input,''); Reset(Input);
  157.             Assign(Output,''); Rewrite(Output);
  158.           End;
  159.         End;
  160.         If Copy(UpperString(ParamStr(x)),1,2) = '-P' Then
  161.         Begin
  162.           FileAreaPathOk := True;
  163.           FileAreaPath := Copy(UpperString(ParamStr(x)),3,Length(ParamStr(x))-2);
  164.           If Length(FileAreaPath) > 0 Then
  165.           Begin
  166.             If Copy(FileAreaPath,Length(FileAreaPath),1) <> '\' Then FileAreaPath := FileAreaPath + '\';
  167.             FindFirst(FileAreaPath+'*.*',AnyFile,DirInfo);
  168.             If DosError <> 0 Then
  169.             Begin
  170.               WriteLn('Directory '+FileAreaPath+' not found!');
  171.               Halt(1);
  172.             End;
  173.           End;
  174.         End;
  175.         If Copy(UpperString(ParamStr(x)),1,2) = '-K' Then
  176.         Begin
  177.           Val(Copy(ParamStr(x),3,1),Columns,Result);
  178.           If Columns < 3 Then Columns := 3;
  179.           If Columns > 8 Then Columns := 8;
  180.         End;
  181.         If Copy(UpperString(ParamStr(x)),1,2) = '-R' Then
  182.         Begin
  183.           MfmRunFb := True;
  184.         End;
  185.       End;
  186.       If Columns = 3 Then ColumnPos := 25;
  187.       If Columns = 4 Then ColumnPos := 20;
  188.       If Columns = 5 Then ColumnPos := 16;
  189.       If Columns = 6 Then ColumnPos := 14;
  190.       If Columns = 7 Then ColumnPos := 12;
  191.       If Columns = 8 Then ColumnPos := 10;
  192.       If (Not AreaPathOk) Then
  193.       Begin
  194.         Fsplit(Fexpand(ParamStr(0)),D,N,E);
  195.         AreaPath := D+'AREA.DAT';
  196.       End;
  197.       GetAreaTable;
  198.       If NumberOfAreaEntries < Columns Then Columns := NumberOfAreaEntries;
  199.       If (Not OutputSelected) Then
  200.       Begin
  201.         ReDirectTo := Console;
  202.         OutputSelected := True;
  203.         AssignCrt(Input); Reset(Input);
  204.         AssignCrt(Output); Rewrite(Output);
  205.       End;
  206.       SetupScreen;
  207.       If (Not FileAreaPathOk) Then
  208.       Begin
  209.         FileAreaPath := ChooseArea;
  210.         If (FileAreaPath = 'QUIT') Or (FileAreaPath = 'QUITQUICK') Then
  211.         Begin
  212.           Halt(250);
  213.         End;
  214.       End;
  215.     End;
  216.   End;
  217. {========================================================================}
  218. Procedure BuildSkipList;
  219.   Var
  220.     Bslb : Byte;
  221.     InFile : Text;
  222.   Begin
  223.     For Bslb := 1 To MaxSkip Do SkipList[Bslb] := 'ACBDEFGHIJKL';
  224.     Fsplit(Fexpand(ParamStr(0)),D,N,E);
  225.     FindFirst(D+'MFM-SKIP.LST',AnyFile,DirInfo);
  226.     If DosError = 0 Then
  227.     Begin
  228.       Assign(InFile,D+'MFM-SKIP.LST');
  229.       Reset(InFile);
  230.       Bslb := 1;
  231.       While (Not Eof(InFile)) And (Bslb < MaxSkip) Do
  232.       Begin
  233.         ReadLn(InFile,SkipList[Bslb]);
  234.         Inc(Bslb);
  235.       End;
  236.       Close(InFIle);
  237.     End;
  238.   End;
  239. {========================================================================}
  240. Begin
  241.   Altered := False; BeginSort := NIL; EndSort := NIL;
  242.   Base153 := Base153A + Base153B + Base153C;
  243.   ParseCommandLine; BuildSkipList;
  244.   NumberOfEntries := 0; BuildList;
  245.   StringToFind := '';
  246.   If NumberOfEntries = 0 Then
  247.   Begin
  248.     AnsiGotoXY(25,1); AnsiClearToEOL;
  249.     Write('This area contains no files!');
  250.     Repeat
  251.       FileAreaPath := ChooseArea;
  252.       NumberOfEntries := 0; BuildList;
  253.       If NumberOfEntries = 0 Then
  254.       Begin
  255.         AnsiGotoXY(25,1); AnsiClearToEOL;
  256.         Write('This area contains no files!');
  257.       End;
  258.     Until NumberOfEntries > 0;
  259.   End;
  260.   If NumberOfEntries > 0 Then
  261.   Begin
  262.     Row := 1; CurrentEntry := FirstEntry; TopEntry := FirstEntry; DisplayScreen;
  263.     Repeat
  264.       Gcx := UpCase(FileAreaPath[1]);
  265.       AnsiGotoXY(24,1);
  266.       NewTextColor(Black); NewTextBackground(Cyan);
  267.       FreeSpace := DiskFree(Ord(Gcx)-64) Div 1024;
  268.       AnsiClearToEol;
  269.       Write(' Number of files = '+MyStr(NumberOfFiles,3)
  270.             +'   Size of files = '+Bytes(SizeOfFiles Div 1024)
  271.             +'   Free space = '+Bytes(FreeSpace)
  272.             +'   ? = Help');
  273.       NewTextColor(White); NewTextBackground(Black);
  274.       AnsiGotoXY(25,1);
  275.       AnsiClearToEol;
  276.       Write(FileAreaPath);
  277.       AnsiGotoXY(24,80);
  278.       Gbx := GetInput;
  279.       Gcx := Upcase(Chr(Gbx));
  280.       If Gbx = 0 Then
  281.       Begin
  282.         Gbx := GetInput;
  283.         Case Gbx Of
  284.           31 : Begin         { ALT-S }
  285.                  ShellToDos;
  286.                  Gcx := ^@;
  287.                End;
  288.           33 : Begin         { ALT-F }
  289.                  CallShez;
  290.                  Gcx := ^@;
  291.                End;
  292.           38 : Begin         { ALT-L }
  293.                  CallList;
  294.                  Gcx := ^@;
  295.                End;
  296.           44 : Begin         { ALT-Z }
  297.                  CallVpic;
  298.                  Gcx := ^@;
  299.                End;
  300.           47 : Begin         { ALT-V }
  301.                  ViewFile;
  302.                  Gcx := ^@;
  303.                End;
  304.           72 : Gcx := '8';
  305.           80 : Gcx := '2';
  306.           73 : Gcx := '9';
  307.           81 : Gcx := '3';
  308.           71 : Gcx := '7';
  309.           79 : Gcx := '1';
  310.         End;
  311.       End;
  312.       Case Gcx Of
  313.         ^A  : AdoptAllOrphans;
  314.         ^B  : FindString('B');
  315.         ^D  : FindString('D');
  316.         ^F  : FindString('F');
  317.         ^Q  : Begin
  318.                 If Altered Then SaveList;
  319.                 RemoveAreaList;
  320.                 Halt(0);
  321.               End;
  322.         ^X  : Begin
  323.                 If CurrentEntry^.PrevEntry <> NIL Then
  324.                   Begin
  325.                     CurrentEntry^.Description := CurrentEntry^.PrevEntry^.Description;
  326.                     NextPrintEntry := CurrentEntry;
  327.                     DisplayRecord(Row);
  328.                     DisplayCurrentLocation;
  329.                   End;
  330.               End;
  331.         ' ' : Begin
  332.                 CurrentEntry^.Tagged := (Not CurrentEntry^.Tagged);
  333.                 LineDown;
  334.                 If CurrentEntry^.NextEntry = NIL Then DisplayCurrentLocation;
  335.               End;
  336.         '8' : LineUp;
  337.         '2' : LineDown;
  338.         '9' : PageUp;
  339.         '3' : PageDown;
  340.         '7' : TopOfList;
  341.         '1' : BottomOfList;
  342.         '#' : MassMove;
  343.         '$' : MassCopy;
  344.         'A' : AdoptAbandon(1);
  345.         'C' : CopyFile;
  346.         'D' : ChangeFileDate;
  347.         'E' : EditDescription;
  348.         'F' : BeginSort := CurrentEntry;
  349.         'I' : InsertBlank;
  350.         'K' : PushRecord(KillEntry);
  351.         'L' : EndSort := CurrentEntry;
  352.         'M' : MoveFile;
  353.         'N' : ChooseNewArea;
  354.         'Q' : Quit;
  355.         'R' : RenameFile;
  356.         'S' : SortList;
  357.         'T' : SortListTime;
  358.         'U' : PopRecord(KillEntry,'B');
  359.         'W' : SaveList;
  360.         '<' : PushRecord(StackEntry);
  361.         '>' : PopRecord(StackEntry,'A');
  362.         ',' : PushRecord(StackEntry);
  363.         '.' : PopRecord(StackEntry,'B');
  364.         '[' : StackPrev(StackEntry);
  365.         ']' : StackNext(StackEntry);
  366.         ';' : ShowStack(StackEntry);
  367.         '{' : StackPrev(KillEntry);
  368.         '}' : StackNext(KillEntry);
  369.         ':' : ShowStack(KillEntry);
  370.         '!' : ReDrawScreen;
  371.         '?' : Help;
  372.       End;
  373.     Until Gcx = #255;
  374.   End;
  375. End.
  376. {========================================================================}
  377.